package com.lancoo.ccas52.redis;

import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName DistributedLockService
 * @Description 分布式锁
 * @Author quin
 * @Date 2023/7/20 17:12
 */
@Service
@Slf4j
public class DistributedLockService {

    @Resource
    private RedissonClient redissonClient;

    public DistributedLockService(RedissonClient redissonClient) {
        this.redissonClient = redissonClient;
    }

    // 获取分布式锁，并在执行完毕后自动释放锁
    public void doWithLock(String lockKey, Runnable action) {
        RLock lock = redissonClient.getLock(lockKey);
        try {
            // 尝试获取锁，最多等待 10 秒，锁的自动释放时间设置为 30 秒
            if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {
                // 获取锁成功，执行业务逻辑
                action.run();
            } else {
                // 获取锁失败，处理并发冲突
                log.warn(lockKey+"获取锁失败");
            }
        } catch (InterruptedException e) {
            // 处理异常
            log.error("获取锁失败，处理并发冲突", e);
        } finally {
            //判断要解锁的key是否已被锁定;判断要解锁的key是否被当前线程持有
            if (lock.isLocked() && lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
    }
//
//    public void a(){
//        RScheduledExecutorService test = redissonClient.getExecutorService("test");
//
//        // 设置每天凌晨的cron表达式
//        String cronExpression = "0 0 0 * * ?"; // 每天0点0分0秒执行
//        // 解析cron表达式
//        CronExpression cron = new CronExpression(cronExpression);
//
//        // 定义任务逻辑
//        Runnable task = () -> {
//            System.out.println("分布式定时任务执行：" + System.currentTimeMillis());
//        };
//        // 计算下次任务执行时间
//        Date nextExecutionTime = cron.getNextValidTimeAfter(new Date());
//        test.scheduleAtFixedRate(task,5,10,TimeUnit.SECONDS);
//    }
}
